package DAO;

import controller.Conexao;
import controller.Fornecedor;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class FornecedorDAO {

    Fornecedor fornecedor = new Fornecedor();
    private Connection connection;
    private Conexao conexao;

    public FornecedorDAO() throws SQLException {
        this.connection = conexao.getConnection();

    }

    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codFornecedor\") from fornecedor;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    public void adiciona(Fornecedor fornecedor) throws SQLException {

        // cria uma lista onde será armazenado o próximo codigo
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(\"codFornecedor\") from fornecedor;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        //adiciona o codigo ao proximo cliente a ser inserido
        fornecedor.setCodFornecedor(codigo.get(0));

        // insere os dados do fornecedor com a conexao para o banco de dados.
        String sql = "insert into fornecedor values (?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, fornecedor.getCodFornecedor());
        stmt.setString(2, fornecedor.getRepresentante());
        stmt.setString(3, fornecedor.getFoneRepresentante());
        stmt.setString(4, fornecedor.getNomeEmpresa());
        stmt.setString(5, fornecedor.getNomeReal());
        stmt.setString(6, fornecedor.getFoneEmpresa());
        stmt.setString(7, fornecedor.getRua());
        stmt.setInt(8, fornecedor.getNumero());
        stmt.setString(9, fornecedor.getBairro());
        stmt.setString(10, fornecedor.getCidade());
        stmt.setString(11, fornecedor.getUf());
        stmt.setString(12, fornecedor.getCep());

        // busca os campos preenchidos na classe de Clientes.

        stmt.execute();
        JOptionPane.showMessageDialog(null, "O Fornecedor foi salvo com sucesso!", "Cadastro Concluído", 1);
        stmt.close();
        // executa e finaliza o processo de adicionar.*/

    }

    public ArrayList<Fornecedor> retornaTodosFornecedor() {
        Statement comando;
        ArrayList<Fornecedor> listaFornecedor = new ArrayList<Fornecedor>();

        try {

            String sql = "SELECT * FROM fornecedor";
            comando = connection.createStatement();
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Fornecedor f = new Fornecedor();

                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setRepresentante(rs.getString("representante"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCep(rs.getString("cep"));
                f.setUf(rs.getString("uf"));

                listaFornecedor.add(f);


            }
            comando.close();

            return listaFornecedor;

        } catch (SQLException ex) {
            return null;
        }
    }

    public void remover(Fornecedor fornecedor) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM fornecedor WHERE \"codFornecedor\"=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, fornecedor.getCodFornecedor());
            comando.execute();
            JOptionPane.showMessageDialog(null, "O fornecedor foi removido com sucesso!", "Remoção Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public void atualizar(Fornecedor fornecedor) {
        PreparedStatement comando;

        try {

            String sql = "UPDATE fornecedor SET representante = ?, \"foneRepresentante\"  = ?, \"nomeEmpresa\" = ?, \"nomeReal\"  = ?, \"foneEmpresa\"  = ?, rua = ?, numero = ?, bairro = ?, cidade = ?, uf = ? WHERE  \"codFornecedor\" = " + fornecedor.getCodFornecedor() + ";";

            comando = connection.prepareStatement(sql);

            comando.setString(1, fornecedor.getRepresentante());
            comando.setString(2, fornecedor.getFoneRepresentante());
            comando.setString(3, fornecedor.getNomeEmpresa());
            comando.setString(4, fornecedor.getNomeReal());
            comando.setString(5, fornecedor.getFoneEmpresa());
            comando.setString(6, fornecedor.getRua());
            comando.setInt(7, fornecedor.getNumero());
            comando.setString(8, fornecedor.getBairro());
            comando.setString(9, fornecedor.getCidade());
            comando.setString(10, fornecedor.getUf());
            comando.setString(10, fornecedor.getCep());


            comando.executeUpdate();
            JOptionPane.showMessageDialog(null, "O Fornecedor foi alterado com sucesso!", "alteraçao Concluída", 1);
            comando.close();

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public ArrayList<Fornecedor> retornaFornecedorPorCod(int cod) {

        PreparedStatement comando;
        ArrayList<Fornecedor> listaFornecedor = new ArrayList<Fornecedor>();

        try {
            String sql = "SELECT * FROM fornecedor WHERE \"codFornecedor\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cod);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Fornecedor f = new Fornecedor();

                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setRepresentante(rs.getString("representante"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeEmpresa(rs.getString("nomeEmpresa"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setUf(rs.getString("uf"));

                listaFornecedor.add(f);
            }

            comando.close();

            return listaFornecedor;

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Fornecedor> retornaFornecedorPorNome(String nome) {
        PreparedStatement comando;
        ArrayList<Fornecedor> listaFornecedor = new ArrayList<Fornecedor>();

        try {

            String sql = "SELECT * FROM fornecedor WHERE representante LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Fornecedor f = new Fornecedor();

                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setRepresentante(rs.getString("representante"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeEmpresa(rs.getString("nomeEmpresa"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setUf(rs.getString("uf"));
                f.setCep(rs.getString("cep"));
                f.setValorConta(rs.getDouble("valorConta"));

                listaFornecedor.add(f);

            }

            comando.close();
            return listaFornecedor;
        } catch (Exception ex) {
            return null;
        }
    }

    public ArrayList<Fornecedor> retornaFornecedorPorNomeEmpresa(String nomeEmpresa) {
        PreparedStatement comando;
        ArrayList<Fornecedor> listaFornecedor = new ArrayList<Fornecedor>();

        try {

            String sql = "SELECT * FROM fornecedor WHERE \"nomeEmpresa\" LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nomeEmpresa + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Fornecedor f = new Fornecedor();

                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setRepresentante(rs.getString("representante"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeEmpresa(rs.getString("nomeEmpresa"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setUf(rs.getString("uf"));

                listaFornecedor.add(f);

            }

            comando.close();
            return listaFornecedor;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Fornecedor> retornaFornecedorPorNomeReal(String nomeReal) {
        PreparedStatement comando;
        ArrayList<Fornecedor> listaFornecedor = new ArrayList<Fornecedor>();

        try {

            String sql = "SELECT * FROM fornecedor WHERE \"nomeReal\" LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nomeReal + "%");
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            while (rs.next()) {

                Fornecedor f = new Fornecedor();

                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setRepresentante(rs.getString("representante"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeEmpresa(rs.getString("nomeEmpresa"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setUf(rs.getString("uf"));

                listaFornecedor.add(f);
            }

            comando.close();
            return listaFornecedor;
        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public Fornecedor retornaFornecedorPorCodigo(int cod) {

        PreparedStatement comando;

        try {
            String sql = "SELECT * FROM fornecedor WHERE \"codFornecedor\" = ?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, cod);
            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.

            Fornecedor f = new Fornecedor();

            while (rs.next()) {


                f.setCodFornecedor(rs.getInt("codFornecedor"));
                f.setBairro(rs.getString("bairro"));
                f.setCep(rs.getString("cep"));
                f.setCidade(rs.getString("cidade"));
                f.setFoneEmpresa(rs.getString("foneEmpresa"));
                f.setFoneRepresentante(rs.getString("foneRepresentante"));
                f.setNomeEmpresa(rs.getString("nomeEmpresa"));
                f.setNomeReal(rs.getString("nomeReal"));
                f.setNumero(rs.getInt("numero"));
                f.setRepresentante(rs.getString("representante"));
                f.setRua(rs.getString("rua"));
                f.setUf(rs.getString("uf"));
                f.setValorConta(rs.getDouble("valorConta"));

            }

            comando.close();

            return f;

        } catch (Exception sqle) {
            return null;
        }
    }

    public void adicionarValorConta(int codFornecedor, Double valor) {
        try {
            String sql = "update fornecedor set \"valorConta\" = \"valorConta\" + ? where \"codFornecedor\" = ?;";

            PreparedStatement stmt = connection.prepareStatement(sql);

            stmt.setDouble(1, valor);
            stmt.setInt(2, codFornecedor);
            // busca os campos preenchidos na classe de Clientes.

            stmt.execute();
            stmt.close();

        } catch (Exception ex) {
        }

    }

    public void descontaConta(Double valor, Fornecedor f, String vencimento) {

        PreparedStatement comando;
        PreparedStatement comando2;

        String[] data = vencimento.split("/");

        int dia = Integer.parseInt(data[0].toString());
        int mes = Integer.parseInt(data[1].toString()) + 1;
        int ano = Integer.parseInt(data[2].toString());


        try {

            String sql = "update fornecedor set \"valorConta\" = \"valorConta\" - ? where fornecedor.\"codFornecedor\" = ?;";
            comando = connection.prepareStatement(sql);
            comando.setDouble(1, valor);
            comando.setInt(2, f.getCodFornecedor());
            comando.execute();
            comando.close();

        } catch (SQLException ex) {
            ex.printStackTrace();
        }

    }
}
